package com.study.spark.scala.chapter07

object Scala10_Collection_Req{
  def main(args: Array[String]): Unit = {
    // TODO 集合 - 需求：不同省份的商品点击排名
    val datas =List(
        ("zhangsan", "河北", "鞋"),
        ("lisi", "河北", "衣服"),
        ("wangwu", "河北", "鞋"),
        ("zhangsan", "河南", "鞋"),
        ("lisi", "河南", "衣服"),
        ("wangwu", "河南", "鞋"),
        ("zhangsan", "河南", "鞋"),
        ("lisi", "河北", "衣服"),
        ("wangwu", "河北", "鞋"),
        ("zhangsan", "河北", "鞋"),
        ("lisi", "河北", "衣服"),
        ("wangwu", "河北", "帽子"),
        ("zhangsan", "河南", "鞋"),
        ("lisi", "河南", "衣服"),
        ("wangwu", "河南", "帽子"),
        ("zhangsan", "河南", "鞋"),
        ("lisi", "河北", "衣服"),
        ("wangwu", "河北", "帽子"),
        ("lisi", "河北", "衣服"),
        ("wangwu", "河北", "电脑"),
        ("zhangsan", "河南", "鞋"),
        ("lisi", "河南", "衣服"),
        ("wangwu", "河南", "电脑"),
        ("zhangsan", "河南", "电脑"),
        ("lisi", "河北", "衣服"),
        ("wangwu", "河北", "帽子")
    )

    // TODO 1.将原始数据进行结构转换 (省份-商品，1)
    val datas1: List[(String, Int)] = datas.map(
      str => {
        (str._2 + "-" + str._3, 1)
      }
    )

    // TODO 2.将结构转换后的数据进行分组：省份-商品
    val datas2: Map[String, List[(String, Int)]] = datas1.groupBy(_._1)

    // TODO 3.将分组后的数据进行统计聚合
    val datas3: Map[String, Int] = datas2.mapValues(
      str => str.size
    )
    println(datas3)//Map(河南-衣服 -> 3, 河北-衣服 -> 6, 河南-帽子 -> 1......

    // TODO 4.再次进行结构转换：(省份，(商品，count()))
    val datas4: List[(String, (String, Int))] = datas3.toList.map(
      str => {
        val k = str._1.split("-")
        val v = str._2
        (k(0), (k(1), v))
      }
    )
    println(datas4)//List((河南,(衣服,3)), (河北,(衣服,6)), (河南,(帽子,1))......

    // TODO 5.再次分组，并排序。将不同省份的商品排序(降序)
    val datas5: Map[String, List[(String, Int)]] = datas4.groupBy(_._1).mapValues(
      str => {
        str.map(_._2).sortBy(_._2)(Ordering.Int.reverse)
      }
    )
    println(datas5)
    //Map(河南 -> List((鞋,6), (衣服,3), (电脑,2), (帽子,1)), 河北 -> List((衣服,6), (鞋,4), (帽子,3), (电脑,1)))
  }
}
